package demo;

/**
 * 解释器模式
 *
 * 解释器模式（Interpreter Pattern）提供了评估语言的语法或表达式的方式，它属于行为型模式。这种模式实现了一个表达式接口，该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
 * 文法和句子的概念同编译原理中的描述相同，“文法”指语言的语法规则，而“句子”是语言集中的元素。
 *
 * 解释器模式角色：
 * 1、抽象表达式（Abstract Expression）角色：定义解释器的接口，约定解释器的解释操作，主要包含解释方法 interpret()。
 * 2、终结符表达式（Terminal Expression）角色：是抽象表达式的子类，用来实现文法中与终结符相关的操作，文法中的每一个终结符都有一个具体终结表达式与之相对应。
 * 3、非终结符表达式（Nonterminal Expression）角色：也是抽象表达式的子类，用来实现文法中与非终结符相关的操作，文法中的每条规则都对应于一个非终结符表达式。
 * 4、环境（Context）角色：通常包含各个解释器需要的数据或是公共的功能，一般用来传递被所有解释器共享的数据，后面的解释器可以从这里获取这些值。
 *
 * @author ZhouWeiBo
 * @create 2022/6/8
 */
public class App {

    public static void main(String[] args) {
        /*
            新闻关键词：北京上海广州深圳的老年人、小孩、孕妇、残疾人可以免费乘坐公交车啦

                                运用解释器设计模式来模拟表达

        */
        Person oldMan = new Person("李奶奶",Role.OLD_MAN,City.BEIJING);
        Person xiaoZhang = new Person("小张",Role.YOUTH,City.CHENGDU);

        FreeBusContext context = new FreeBusContext();

        System.out.println(
                "问："+oldMan.getName()+"可以免费乘坐公交车吗？答："+(context.isFree(oldMan)?"是":"否")
        );;
        System.out.println(
                "问："+xiaoZhang.getName()+"可以免费乘坐公交车吗？答："+(context.isFree(xiaoZhang)?"是":"否")
        );;

    }
}
